Regression
1 Introduction
On commence par importer le jeu de données:
# importation des données
train <- read.csv("train_set.csv", header = T, sep = ",", dec = ".")
test <- read.csv("test_set.csv", header = T, sep = ",", dec = ".")
# appercu des données
rmarkdown::paged_table(train)On effectue un petit pré-traitement des données en vérifiants si elle contient des valeurs manquantes,
## [1] 0
ce qui n’est pas le cas. On peut donc continuer avec l’analyse des données en vérifiant le type des variables:
On va transformer bonus_malus en binaire
train$Bonus_Malus <- ifelse(train$Bonus_Malus < 100, 1, 0)
test$Bonus_Malus <- ifelse(test$Bonus_Malus < 100, 1, 0)Puis
On va convertir les variables catégorielles en facteur on Obtient alors:
variables <- classifier_variables_tab(train)
numeric_variables <- variables$variables_numeriques
categorical_variables <- append(variables$variables_categorielles, variables$variables_binaires)
# convertir les varianles catégorielles en factor
train[categorical_variables] <- lapply(train[categorical_variables], factor)
test[categorical_variables] <- lapply(test[categorical_variables], factor)
str(train)## 'data.frame': 542389 obs. of 12 variables:
## $ PolID : num 54009 93954 2239279 3016883 3253234 ...
## $ Claim : int 4 5 8 4 11 4 0 0 0 0 ...
## $ Period_Exp : num 0.56 1 0.41 0.27 0.08 0.1 0.96 0.73 0.09 0.73 ...
## $ Car_Power : int 4 7 4 5 4 4 14 10 4 5 ...
## $ Car_Age : int 4 9 12 9 13 1 25 2 12 4 ...
## $ Age : int 46 67 52 23 53 31 49 38 27 32 ...
## $ Bonus_Malus : Factor w/ 2 levels "0","1": 2 2 2 2 2 2 2 2 2 2 ...
## $ Car_Model : Factor w/ 11 levels "B1","B10","B11",..: 9 7 1 8 1 4 2 4 10 8 ...
## $ Car_Fuel : Factor w/ 2 levels "Diesel","Regular": 1 1 2 1 2 2 2 1 2 1 ...
## $ Urban_rural_class: Factor w/ 6 levels "A","B","C","D",..: 1 5 4 5 4 5 5 3 3 3 ...
## $ Inhab_density : int 29 4762 824 6924 824 2983 5053 160 229 461 ...
## $ French_region : Factor w/ 22 levels "Alsace","Aquitaine",..: 7 21 13 12 13 17 12 20 6 6 ...
On remarque que la variable French_region qui représente les régions de france correpond aux anciennes régions de 2015 on va d’abord formater les noms pour qu’elles correspondent aux nouvelles régions de 2025
Ici on garde les anciennes regions:
# Créer le vecteur de correspondance
region_mapping <- c(`Ile-de-France` = "ÃŽle-de-France", `Champagne-Ardenne` = "Champagne-Ardenne",
Picardie = "Picardie", `Haute-Normandie` = "Haute-Normandie", Centre = "Centre",
`Basse-Normandie` = "Basse-Normandie", Bourgogne = "Bourgogne", `Nord-Pas-de-Calais` = "Nord-Pas-de-Calais",
Lorraine = "Lorraine", Alsace = "Alsace", `Franche-Comte` = "Franche-Comté",
`Pays-de-la-Loire` = "Pays de la Loire", Bretagne = "Bretagne", `Poitou-Charentes` = "Poitou-Charentes",
Aquitaine = "Aquitaine", `Midi-Pyrenees` = "Midi-Pyrénées", Limousin = "Limousin",
`Rhone-Alpes` = "Rhône-Alpes", Auvergne = "Auvergne", `Languedoc-Roussillon` = "Languedoc-Roussillon",
`Provence-Alpes-Cotes-D'Azur` = "Provence-Alpes-Côte d'Azur", Corse = "Corse")
# Appliquer la correspondance aux noms de régions dans le jeu de données
train_old <- train %>%
mutate(French_region = recode(French_region, !!!region_mapping))
# 4. Préparer les données pour la carte Calculer le nombre total de Claim par
# région
old_claim_region <- train_old %>%
group_by(French_region) %>%
summarise(Total_Claim = sum(Claim))
old_france_map <- st_read("regions-avant-redecoupage-2015.geojson")## Reading layer `regions-avant-redecoupage-2015' from data source
## `/home/cytech/Desktop/regression/Projet_regression/regions-avant-redecoupage-2015.geojson'
## using driver `GeoJSON'
## Simple feature collection with 22 features and 2 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: -5.139017 ymin: 41.36307 xmax: 9.55983 ymax: 51.0894
## Geodetic CRS: WGS 84
# 5. Joindre la carte avec les données
old_france_map <- old_france_map %>%
left_join(old_claim_region, by = c(nom = "French_region"))
# 6. Tracer la carte
centroides <- old_france_map %>%
st_centroid() %>%
mutate(long = st_coordinates(.)[, 1], lat = st_coordinates(.)[, 2])
ggplot(old_france_map) + geom_sf(aes(fill = Total_Claim), color = "white") + scale_fill_viridis_c(option = "C",
na.value = "grey90") + geom_text(data = centroides, aes(x = long, y = lat, label = nom),
color = "black", size = 2, fontface = "bold") + theme_minimal() + labs(title = "Répartition des sinistres (Claim) par région en France",
fill = "Total Claim")## [1] 21119
On divise notre dataset à présent entre variable cible et variables explicatives.
1.0.1 Distribution de la variable cible
On s’intéresse maintenant à la distrubution de notre variable cible.
# train$Claim<-as.factor(train$Claim)
# Distribution de la variable cible
ggplot(train, aes(x = Claim)) + geom_histogram(binwidth = 1, fill = "skyblue", color = "black") +
labs(title = "Distribution de la variable Claim", x = "Nombre de sinistres",
y = "Fréquence")Pourcentage de chaque factor de la variable cible
library(ggplot2)
# Étape 1 : Calculer la fréquence de chaque valeur unique de 'Claim'
frequences <- table(train$Claim)
# Étape 2 : Convertir les fréquences en pourcentages
pourcentages <- prop.table(frequences) * 100
# Étape 3 : Créer un dataframe pour ggplot
data_plot <- data.frame(
Classe = names(frequences),
Pourcentage = as.numeric(pourcentages)
)
# Étape 4 : Ajouter les pourcentages aux labels des classes
data_plot$Classe <- paste0(data_plot$Classe, " (", round(data_plot$Pourcentage, 5), "%)")
# Étape 5 : Créer le diagramme en camembert
ggplot(data_plot, aes(x = "", y = Pourcentage, fill = Classe)) +
geom_bar(stat = "identity", width = 1) + # Créer des barres empilées
coord_polar(theta = "y") + # Transformer en camembert
labs(title = "Répartition des Claims en pourcentages") + # Titre
theme_void() + # Supprimer les axes pour un style camembert
theme(legend.position = "right") # Afficher la légende à droite1.0.2 Étude descriptive des variables explicatives numériques
On va maintenant observer la distribution des variables explicatives numériques
numeric_variables <- setdiff(numeric_variables, "Claim")
hist_plots <- list()
box_plots <- list()
for (col in numeric_variables) {
hist <- ggplot(features, aes_string(x = col)) + geom_histogram(fill = "green",
color = "black") + labs(title = paste("", col), x = col, y = "Fréquence") +
theme_minimal()
hist_plots[[col]] <- hist
box <- ggplot(features, aes_string(y = col)) + geom_boxplot(linewidth = 0.3) +
labs(title = paste("", col)) + theme_bw()
box_plots[[col]] <- box
}
n <- length(hist_plots)# Organisation des graphiques dans une grille 4x2
i = 1
grid.arrange(grobs = c(hist_plots[i:min(i + 1, n)], box_plots[i:min(i + 1, n)]),
ncol = 2, )plot_hist <- function(i) {
if (i > n/2) {
return("i trop grand")
}
grid.arrange(grobs = c(hist_plots[i:min(i + 1, n)], box_plots[i:min(i + 1, n)]),
ncol = 2, )
}
plot_hist <- function(i) {
if (i > n) {
return("i trop grand")
}
grid.arrange(grobs = c(hist_plots[i:min(i, n)], box_plots[i:min(i, n)]), ncol = 2,
)
}ggplot(data = train, aes(x = Bonus_Malus, y = Claim)) + geom_boxplot(fill = "steelblue") +
labs(title = paste("Distribution de Claim par Bonus_Malus"), x = "Bonus_Malus",
y = "Claim")box_plot <- function(col) {
p1 <- ggplot(train, aes(x = Claim, y = .data[[col]], fill = as.factor(Claim))) +
geom_boxplot() + labs(title = paste("Distribution de", col, " par Claim"),
x = "Claim", y = col)
# Histogram with 20 bins Histogram
p2 <- ggplot(train, aes(x = .data[[col]], fill = as.factor(Claim))) + geom_histogram(color = "black",
bins = 10, alpha = 0.7) + labs(title = paste("Histogramme de", col, "par Claim"),
x = col, y = "Nombre") + theme_bw()
return(p2)
}
hist_plot <- function(col) {
# calculate the number of participants in each class
df <- train %>%
group_by(Claim) %>%
count(.data[[col]])
p1 <- ggplot(df, aes(x = n, y = reorder(.data[[col]], n), fill = Claim)) + geom_bar(stat = "identity",
color = "black", width = 0.7) + scale_fill_brewer(palette = "Set2") + theme(legend.position = "bottom") +
labs(title = paste("Répartition de claim par", col), x = "nombre d'observations",
y = col)
p2 <- ggplot(train, aes(x = .data[[col]], fill = as.factor(Claim))) + geom_bar(position = "dodge") +
coord_flip() + labs(title = paste("Répartition des sinistres par", col),
x = col, y = "Nombre de polices") + scale_fill_brewer(palette = "Set2", name = "Nombre de sinistres")
return(p2)
}
for (col in numeric_variables) {
print(box_plot(col))
}2 Premier modèle
on effectue un premier modèle:
train_1 <- train %>%
select(-PolID)
# train_1$Claim<-as.numeric(train_1$Claim)
train_1$Claim <- as.numeric(train_1$Claim)
head(train_1$Claim)## [1] 4 5 8 4 11 4
# Standardiser toutes les colonnes numériques
train_1 <- train_1 %>%
select(-Claim)
# Identifier les colonnes numériques
numeric_cols <- sapply(train_1, is.numeric)
# Standardiser les colonnes numériques
train_1[numeric_cols] <- scale(train_1[numeric_cols])
train_1$Claim <- train$Claim
# Vérification des résultats
head(train_1)## Period_Exp Car_Power Car_Age Age Bonus_Malus Car_Model Car_Fuel
## 1 0.08616596 -1.1971020 -0.5358617 0.03592947 1 B4 Diesel
## 2 1.29339720 0.2666048 0.3465642 1.52099069 1 B2 Diesel
## 3 -0.32539015 -1.1971020 0.8760197 0.46023268 1 B1 Regular
## 4 -0.70950918 -0.7091997 0.3465642 -1.59056614 1 B3 Diesel
## 5 -1.23081358 -1.1971020 1.0525049 0.53094988 1 B1 Regular
## 6 -1.17593943 -1.1971020 -1.0653173 -1.02482854 1 B12 Regular
## Urban_rural_class Inhab_density French_region Claim
## 1 A -0.4451670 Centre 4
## 2 E 0.7489779 Provence-Alpes-Cotes-D'Azur 5
## 3 D -0.2445870 Languedoc-Roussillon 8
## 4 E 1.2944546 Ile-de-France 4
## 5 D -0.2445870 Languedoc-Roussillon 11
## 6 E 0.3001328 Nord-Pas-de-Calais 4
# Créer un modèle de régression linéaire
poisson_model <- glm(Claim ~ ., family = poisson(link = "log"), data = train_1)
summary(poisson_model)##
## Call:
## glm(formula = Claim ~ ., family = poisson(link = "log"), data = train_1)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -2.4095656 0.1203719 -20.018 < 2e-16
## Period_Exp 0.5178269 0.0079511 65.127 < 2e-16
## Car_Power 0.0583133 0.0075148 7.760 8.50e-15
## Car_Age -0.0699864 0.0080025 -8.746 < 2e-16
## Age -0.0340098 0.0072665 -4.680 2.86e-06
## Bonus_Malus1 -1.1842345 0.0247755 -47.799 < 2e-16
## Car_ModelB10 -0.0039247 0.0437139 -0.090 0.92846
## Car_ModelB11 0.0663712 0.0475755 1.395 0.16299
## Car_ModelB12 -0.3614192 0.0249416 -14.491 < 2e-16
## Car_ModelB13 -0.0130719 0.0513508 -0.255 0.79906
## Car_ModelB14 -0.2699291 0.1010197 -2.672 0.00754
## Car_ModelB2 0.0051648 0.0191457 0.270 0.78734
## Car_ModelB3 0.0512657 0.0265936 1.928 0.05389
## Car_ModelB4 0.0547956 0.0360393 1.520 0.12840
## Car_ModelB5 0.0897259 0.0308058 2.913 0.00358
## Car_ModelB6 0.0294621 0.0344660 0.855 0.39265
## Car_FuelRegular -0.1455514 0.0142646 -10.204 < 2e-16
## Urban_rural_classB 0.0964519 0.0294461 3.276 0.00105
## Urban_rural_classC 0.1720092 0.0244208 7.044 1.87e-12
## Urban_rural_classD 0.3474400 0.0258668 13.432 < 2e-16
## Urban_rural_classE 0.4590514 0.0334782 13.712 < 2e-16
## Urban_rural_classF 0.5463327 0.1151594 4.744 2.09e-06
## Inhab_density 0.0006444 0.0188130 0.034 0.97267
## French_regionAquitaine 0.0026501 0.1199062 0.022 0.98237
## French_regionAuvergne -0.0448582 0.1476256 -0.304 0.76123
## French_regionBasse-Normandie 0.0515549 0.1258624 0.410 0.68209
## French_regionBourgogne -0.0271764 0.1303560 -0.208 0.83486
## French_regionBretagne 0.0179530 0.1178328 0.152 0.87890
## French_regionCentre -0.0075085 0.1160424 -0.065 0.94841
## French_regionChampagne-Ardenne 0.1255850 0.1648395 0.762 0.44614
## French_regionCorse 0.1836215 0.1503145 1.222 0.22187
## French_regionFranche-Comte -0.0263704 0.2109385 -0.125 0.90051
## French_regionHaute-Normandie -0.1799677 0.1369316 -1.314 0.18875
## French_regionIle-de-France -0.0182357 0.1179182 -0.155 0.87710
## French_regionLanguedoc-Roussillon -0.0392083 0.1201245 -0.326 0.74412
## French_regionLimousin 0.3100948 0.1404370 2.208 0.02724
## French_regionLorraine -0.1661849 0.1262328 -1.316 0.18801
## French_regionMidi-Pyrenees -0.2706551 0.1287075 -2.103 0.03548
## French_regionNord-Pas-de-Calais -0.0539480 0.1206410 -0.447 0.65475
## French_regionPays-de-la-Loire -0.0044736 0.1182986 -0.038 0.96983
## French_regionPicardie 0.1757463 0.1303619 1.348 0.17761
## French_regionPoitou-Charentes 0.0553823 0.1217653 0.455 0.64923
## French_regionProvence-Alpes-Cotes-D'Azur 0.0809062 0.1165702 0.694 0.48765
## French_regionRhone-Alpes 0.1953056 0.1161193 1.682 0.09258
##
## (Intercept) ***
## Period_Exp ***
## Car_Power ***
## Car_Age ***
## Age ***
## Bonus_Malus1 ***
## Car_ModelB10
## Car_ModelB11
## Car_ModelB12 ***
## Car_ModelB13
## Car_ModelB14 **
## Car_ModelB2
## Car_ModelB3 .
## Car_ModelB4
## Car_ModelB5 **
## Car_ModelB6
## Car_FuelRegular ***
## Urban_rural_classB **
## Urban_rural_classC ***
## Urban_rural_classD ***
## Urban_rural_classE ***
## Urban_rural_classF ***
## Inhab_density
## French_regionAquitaine
## French_regionAuvergne
## French_regionBasse-Normandie
## French_regionBourgogne
## French_regionBretagne
## French_regionCentre
## French_regionChampagne-Ardenne
## French_regionCorse
## French_regionFranche-Comte
## French_regionHaute-Normandie
## French_regionIle-de-France
## French_regionLanguedoc-Roussillon
## French_regionLimousin *
## French_regionLorraine
## French_regionMidi-Pyrenees *
## French_regionNord-Pas-de-Calais
## French_regionPays-de-la-Loire
## French_regionPicardie
## French_regionPoitou-Charentes
## French_regionProvence-Alpes-Cotes-D'Azur
## French_regionRhone-Alpes .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 140439 on 542388 degrees of freedom
## Residual deviance: 132724 on 542345 degrees of freedom
## AIC: 173410
##
## Number of Fisher Scoring iterations: 6
. Interprétation générale Le modèle cherche à expliquer le nombre de sinistres (Claim) en fonction des variables explicatives. Les coefficients représentent les effets logarithmiques des variables explicatives sur l’espérance du nombre de sinistres.
- Résumé des résultats Deviance résiduelle : 132724, comparée à une deviance nulle de 140439, indique que le modèle explique une partie importante de la variabilité des données, bien qu’une proportion reste non expliquée. AIC (Akaike Information Criterion) : 173410, qui peut être utilisé pour comparer ce modèle à d’autres modèles (un AIC plus bas est préférable).
- Variables significatives Les variables avec une valeur p < 0.05 sont considérées comme statistiquement significatives. Voici les principales :
Très significatives (p < 0.001) :
Period_Exp: Impact positif important. Car_Power: Augmentation modérée des sinistres. Car_Age et Age: Effet négatif sur le nombre de sinistres. Bonus_Malus1: Impact fortement négatif. Plusieurs classes de Urban_rural_class montrent une augmentation significative. Car_ModelB12: Effet négatif notable. Car_FuelRegular: Réduction significative des sinistres. Modérément significatives (p < 0.05) :
Car_ModelB5: Effet positif. French_regionLimousin: Effet positif. French_regionMidi-Pyrenees: Effet négatif. Variables non significatives :
La plupart des catégories de Car_Model et French_region ont des p-valeurs élevées (> 0.05), ce qui suggère qu’elles n’ont pas d’effet significatif sur le nombre de sinistres. 4. Points d’attention Variables non significatives :
Certaines variables, comme Car_Model ou French_region, pourraient être supprimées ou regroupées pour simplifier le modèle sans perte d’information. Surdispersion :
Si la variance des données dépasse la moyenne, le modèle de Poisson pourrait ne pas être adéquat. Vérifiez la présence de surdispersion (rapport de la deviance résiduelle au degré de liberté > 1). Si surdispersion présente, envisagez un modèle binomial négatif. Interactions :
Testez si des interactions entre les variables (e.g., Period_Exp et Bonus_Malus1) améliorent la précision du modèle. 5. Recommandations Validation du modèle : Effectuez des diagnostics sur les résidus pour vérifier l’ajustement du modèle. Modèles alternatifs : Si surdispersion détectée, utilisez un modèle binomial négatif. Simplicité : Envisagez de supprimer les variables non significatives ou de regrouper les modalités de variables catégoriques (e.g., Car_Model, French_region). Interactions : Testez des modèles incluant des interactions pertinentes entre variables.
Pour ton fichier train_set.csv, voici quelques visualisations pertinentes pour explorer les données et leur structure.
Ces visualisations utilisent des bibliothèques comme ggplot2 pour produire des graphiques clairs et interprétables.
Un second modele avec un lasso :
# Charger le package
library(glmnet)
# Convertir les données en matrice pour glmnet
x <- model.matrix(Claim ~ . - 1, data = train_1) # Variables explicatives
y <- train_1$Claim # Variable cible
# Ajuster un modèle Lasso
lasso_model <- glmnet(x, y, family = "poisson", alpha = 1) # alpha = 1 pour Lasso
# Visualiser le chemin des coefficients
plot(lasso_model, xvar = "lambda", label = TRUE)# Validation croisée pour choisir le meilleur lambda
cv_lasso <- cv.glmnet(x, y, family = "poisson", alpha = 1)
# Lambda optimal
best_lambda <- cv_lasso$lambda.min
cat("Lambda optimal :", best_lambda, "\n")## Lambda optimal : 5.487092e-05
# Recalculer le modèle avec le meilleur lambda
final_lasso <- glmnet(x, y, family = "poisson", alpha = 1, lambda = best_lambda)
# Obtenir les coefficients sélectionnés
selected_coefficients <- coef(final_lasso)
print(selected_coefficients)## 45 x 1 sparse Matrix of class "dgCMatrix"
## s0
## (Intercept) -3.572146e+00
## Period_Exp 5.156739e-01
## Car_Power 5.600648e-02
## Car_Age -6.792225e-02
## Age -3.286979e-02
## Bonus_Malus0 1.181187e+00
## Bonus_Malus1 -5.666698e-12
## Car_ModelB10 .
## Car_ModelB11 5.964064e-02
## Car_ModelB12 -3.596002e-01
## Car_ModelB13 -4.915316e-03
## Car_ModelB14 -2.508756e-01
## Car_ModelB2 .
## Car_ModelB3 4.574421e-02
## Car_ModelB4 4.641155e-02
## Car_ModelB5 8.227940e-02
## Car_ModelB6 2.126539e-02
## Car_FuelRegular -1.421047e-01
## Urban_rural_classB 7.149153e-02
## Urban_rural_classC 1.478610e-01
## Urban_rural_classD 3.211234e-01
## Urban_rural_classE 4.271385e-01
## Urban_rural_classF 4.775462e-01
## Inhab_density 5.270303e-03
## French_regionAquitaine .
## French_regionAuvergne -2.255216e-02
## French_regionBasse-Normandie 4.648372e-02
## French_regionBourgogne -1.264711e-02
## French_regionBretagne 1.989180e-02
## French_regionCentre -4.972886e-03
## French_regionChampagne-Ardenne 9.726162e-02
## French_regionCorse 1.596270e-01
## French_regionFranche-Comte .
## French_regionHaute-Normandie -1.564519e-01
## French_regionIle-de-France -1.911171e-03
## French_regionLanguedoc-Roussillon -2.627970e-02
## French_regionLimousin 2.907098e-01
## French_regionLorraine -1.485367e-01
## French_regionMidi-Pyrenees -2.519868e-01
## French_regionNord-Pas-de-Calais -3.860241e-02
## French_regionPays-de-la-Loire .
## French_regionPicardie 1.696757e-01
## French_regionPoitou-Charentes 5.057007e-02
## French_regionProvence-Alpes-Cotes-D'Azur 8.378805e-02
## French_regionRhone-Alpes 1.988573e-01
2.0.1 PCA
# install.packages('FactoMineR') Analyse en composantes principales (PCA)
library(FactoMineR)
numeric_variables <- names(train_1)[sapply(train_1, is.numeric)]
# Vérification des colonnes sélectionnées
print(numeric_variables)## [1] "Period_Exp" "Car_Power" "Car_Age" "Age"
## [5] "Inhab_density" "Claim"
# Réalisation de l'ACP
library(FactoMineR)
res_pca <- PCA(train_1[numeric_variables], graph = FALSE)
# {érification de la structure des résultats
summary(res_pca)##
## Call:
## PCA(X = train_1[numeric_variables], graph = FALSE)
##
##
## Eigenvalues
## Dim.1 Dim.2 Dim.3 Dim.4 Dim.5 Dim.6
## Variance 1.261 1.100 1.012 0.993 0.913 0.721
## % of var. 21.021 18.326 16.872 16.547 15.223 12.011
## Cumulative % of var. 21.021 39.347 56.219 72.766 87.989 100.000
##
## Individuals (the 10 first)
## Dist Dim.1 ctr cos2 Dim.2 ctr cos2 Dim.3
## 1 | 19.330 | 4.381 0.003 0.051 | 2.337 0.001 0.015 | 15.439
## 2 | 24.245 | 6.507 0.006 0.072 | 4.805 0.004 0.039 | 19.852
## 3 | 38.782 | 9.077 0.012 0.055 | 4.617 0.004 0.014 | 31.686
## 4 | 19.417 | 2.999 0.001 0.024 | 1.462 0.000 0.006 | 16.828
## 5 | 53.392 | 11.753 0.020 0.048 | 6.372 0.007 0.014 | 43.751
## 6 | 19.411 | 2.648 0.001 0.019 | 1.861 0.001 0.009 | 15.945
## 7 | 5.078 | 1.465 0.000 0.083 | 0.446 0.000 0.008 | 1.408
## 8 | 2.139 | -0.360 0.000 0.028 | 0.511 0.000 0.057 | 0.157
## 9 | 2.356 | -0.560 0.000 0.056 | -2.114 0.001 0.805 | 0.008
## 10 | 1.468 | 0.007 0.000 0.000 | -0.690 0.000 0.221 | -0.166
## ctr cos2
## 1 0.043 0.638 |
## 2 0.072 0.670 |
## 3 0.183 0.668 |
## 4 0.052 0.751 |
## 5 0.349 0.671 |
## 6 0.046 0.675 |
## 7 0.000 0.077 |
## 8 0.000 0.005 |
## 9 0.000 0.000 |
## 10 0.000 0.013 |
##
## Variables
## Dim.1 ctr cos2 Dim.2 ctr cos2 Dim.3 ctr
## Period_Exp | 0.770 46.967 0.592 | 0.216 4.261 0.047 | 0.027 0.070
## Car_Power | -0.170 2.295 0.029 | 0.333 10.074 0.111 | 0.229 5.166
## Car_Age | 0.523 21.646 0.273 | -0.473 20.365 0.224 | 0.161 2.566
## Age | 0.368 10.722 0.135 | 0.732 48.738 0.536 | -0.355 12.418
## Inhab_density | -0.414 13.593 0.171 | 0.403 14.738 0.162 | 0.338 11.277
## Claim | 0.245 4.778 0.060 | 0.142 1.823 0.020 | 0.833 68.503
## cos2
## Period_Exp 0.001 |
## Car_Power 0.052 |
## Car_Age 0.026 |
## Age 0.126 |
## Inhab_density 0.114 |
## Claim 0.693 |
2.0.2 2. Distribution de l’âge des conducteurs
Un histogramme pour voir la répartition des âges.
ggplot(train, aes(x = Age)) + geom_histogram(binwidth = 5, fill = "green", color = "black") +
labs(title = "Répartition de l'âge des conducteurs", x = "Âge", y = "Fréquence")2.0.3 3. Relation entre Car_Power et Claim
Un boxplot pour comprendre comment la puissance de la voiture influence le nombre de sinistres.
ggplot(train, aes(x = as.factor(Car_Power), y = Claim)) + geom_boxplot(fill = "lightblue") +
labs(title = "Relation entre la puissance de la voiture et les sinistres", x = "Puissance de la voiture",
y = "Nombre de sinistres")2.0.4 4. Répartition des sinistres par type de carburant (Car_Fuel)
Un graphique en barres pour analyser comment le carburant influence le nombre de sinistres.
ggplot(train, aes(x = Car_Fuel, fill = as.factor(Claim))) + geom_bar(position = "dodge") +
labs(title = "Répartition des sinistres par type de carburant", x = "Type de carburant",
y = "Nombre de polices") + scale_fill_brewer(palette = "Set3", name = "Nombre de sinistres")2.0.5 5. Répartition des sinistres par région
Un graphique en barres pour visualiser les différences régionales.
ggplot(train, aes(x = French_region, fill = as.factor(Claim))) + geom_bar(position = "dodge") +
coord_flip() + labs(title = "Répartition des sinistres par région", x = "Région",
y = "Nombre de polices") + scale_fill_brewer(palette = "Set2", name = "Nombre de sinistres")2.0.6 6. Relation entre la densité de population et les sinistres
Un graphique en points pour explorer la corrélation entre la densité d’habitants et le nombre de sinistres.
ggplot(train, aes(x = Inhab_density, y = Claim)) + geom_point(alpha = 0.3, color = "purple") +
geom_smooth(method = "lm", color = "red", se = FALSE) + labs(title = "Relation entre densité d'habitants et sinistres",
x = "Densité de population", y = "Nombre de sinistres")2.0.7 7. Corrélation entre variables numériques
Une heatmap pour visualiser les corrélations entre les variables numériques.
library(reshape2)
cor_matrix <- cor(train[, c("Claim", "Period_Exp", "Car_Power", "Car_Age", "Age",
"Inhab_density")])
melted_cor <- melt(cor_matrix)
ggplot(data = melted_cor, aes(x = Var1, y = Var2, fill = value)) + geom_tile() +
scale_fill_gradient2(low = "red", high = "blue", mid = "white", midpoint = 0) +
labs(title = "Heatmap des corrélations", x = "", y = "")# Distribution des variables numériques
num_vars <- train[, c("Claim", "Period_Exp", "Car_Power", "Car_Age", "Age", "Inhab_density")]
corr_matrix <- cor(num_vars)
corrplot(corr_matrix, method = "circle")# Relation entre Age et Claim
train %>%
ggplot(aes(x = Age, y = Claim)) + geom_point(alpha = 0.5) + labs(title = "Relation entre Age et Claim",
x = "Age", y = "Claim")## [1] 100